Flutter 多 Flavor 代码隔离方案

在 Flutter 开发中,有一些仅用于 Debug 环境下的代码、资源。我们希望在 Release 包中不包含这些 Debug 代码、资源。

在本文中,我对这一主题进行探索,逐步梳理出解决方案。


需求是什么?

我们在开发环境中,有很多 Dev 工具,比如联调环境切换、UI 走查工具等。我们希望 Release 包中不包含这些功能。

一种简单的方法,是在代码中进行判断,如果是 Dev 构建环境(kDebugMode),再注册工具。这种方法存在缺点,这只是让代码在 Release 下不执行了,但相关的 Dev 工具代码、资源依旧会编译进入 Release 包中。

而我所希望的是,有一种机制,能做到完全隔离:Dev 的依赖、代码、资源,在 Release 下完全不存在


多 Release 场景下的代码隔离

实际问题要更加复杂一些:我们需要构建两种 Release 包,一种面向 QA(需要带有 Dev 工具),一种是正式发布包 Release,不带有任何 Dev 工具。

并且,这两个包都需要从集成构建平台上构建,而非本地构建。本地构建更加灵活,平台构建相对固定,能使用的能力也少一些。


Flutter Android Flavor

在 Flutter 工程的 android/app/build.gradle 中创建 flavorDimension

使用命令行运行的方法:

flutter run --flavor free

在 VS Code 中设置的方法:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "free",
      "request": "launch",
      "type": "dart",
      "program": "lib/main_development.dart",
      "args": ["--flavor", "free", "--target", "lib/main_free.dart" ]
    }
  ],
  "compounds": []
}

可以看到,除了指定 flavor 外,还能指定不同的入口。


资源 Flavor

资源 Assets 支持配置 flavor,这样,只有在构建特定 flavor 的时候,才会包含对应资源:

flutter:
  assets:
    - assets/common/
    - path: assets/free/
      flavors:
        - free
    - path: assets/premium/
      flavors:
        - premium

其中,当应用程序在 flutter runflutter build 期间构建时, assets/common/ 目录中的文件将始终被捆绑。仅当 --flavor 选项设置为 free 时,才会捆绑 assets/free/ 目录中的文件。同样,仅当 --flavor 设置为 premium 时,才会捆绑 assets/premium 目录中的文件。


flutter_flavor

Flavors 帮助我们为 App 的不同实例创建构建。例如,我们可以创建一种用于 Debug 的风格、一种用于 Release 的风格。

这个方案不涉及代码隔离。整体思路是,在运行时指定不同的代码入口,flutter_flavor 提供了一个 FlavorConfig 组件,不同入口向 FlavorConfig 中配置不同的信息,实现不同环境的指示。

这种不是我想要的,我想要的是更加底层的源码隔离。


flutter_flavorizr

在项目根目录中创建一个新的配置文件 flavorizr.yaml,指定 Flavor、AppId 等。

形成了一种通用的配置框架,能从 Flutter 侧对 Host 工程进行一些处理操作。

这个方案更加底层一些,但还不是我想要的。


dev-dependencies


网络资源


本文作者:Maeiee

本文链接:Flutter 多 Flavor 代码隔离方案

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!